// 服务端 -- 启动服务器等 ..

#include "Common.hpp"
#include "TcpServer.hpp"
#include "Log.hpp"
#include "Protocol.hpp"
#include "NetCal.hpp"
#include "Deamon.hpp"

#include <memory>
using namespace LogModule;

// 1. 正常命令行启动

void Usage()
{
    std::cout << "Usage : ./NetCallServer  port" << std::endl;
}

// ./NetCallServer port
int main(int argc, char *argv[])
{
    if (argc != 2)
    {
        Usage();
        exit(USAGE_ERROR);
    }
    uint16_t port = std::stoi(argv[1]);


    //对服务器守护进程化 , 只要守护了 0 , 1, 2 就被丢弃了
    //所以 , 这里日志打印到文件中的作用就出来了 

    // 0. 守护进程化 -- 用我们写的 
    Daemon(0,0); // 0,0 ; 更改到 "/" , 重定向0,1,2

    
    // 1. 初始化日志 -- 向文件中打印 
    Enable_File_Log_Strategy();


    // 所以 , 进行了层状设计 :

    // 第一层(顶层): 应用层 -- 只负责完成具体的业务
    std::unique_ptr<Cal> cal = std::make_unique<Cal>();


    // 第2层 : 协议层  -- 只负责定义通信双方怎么通信 
    std::unique_ptr<Protocol> protocol = std::make_unique<Protocol>([&cal](Request &req)->Response
    {   
        //具体的任务 , 就让第一层来完成吧 !
        return cal->Execute(req);
    });



    // 第3层 : 服务器层 -- 构建 TcpServer 对象 -- 服务器只负责通信
    std::unique_ptr<TcpServer> tcpserver = std::make_unique<TcpServer>(port, [&protocol]
    (std::shared_ptr<Socket> &sock, InteInfo &client)
    {
        //该层只负责通信 , 所以需要协议
        protocol->GetRequest(sock ,client); // 服务器得到请求了 
    });


    // 启动服务器
    tcpserver->Start();

    return 0;
}
